package belleza.relativa

import belleza.relativa.security.User

class ConversacionService {

    /*
        Guarda una conversación asociando la misma a la persona que la creo (primeraPersonaId)
        y a la otra persona participante (segundaPersonaId)
     */

    def crear(def primeraPersonaId, def segundaPersonaId) {
        def primeraPersona = Persona.findById(primeraPersonaId)
        def segundaPersona = Persona.findById(segundaPersonaId)
        def conversacion = Conversacion.findByPrimeraPersonaAndSegundaPersona(primeraPersona, segundaPersona)
        def map = ["saved": true, "conversacion": null]
        if (!conversacion) {
            conversacion = new Conversacion()
            conversacion.setPrimeraPersona(primeraPersona)
            conversacion.setSegundaPersona(segundaPersona)
            conversacion.setFechaPrimerMensajeAMostrar(new Date(0L))
            conversacion.setMensajesSinLeer(false)
            conversacion.setBorrada(false)
            primeraPersona?.addToConversaciones(conversacion)
            map["saved"] = primeraPersona?.save()

        } else {
            conversacion.setBorrada(false)
            conversacion.setFechaPrimerMensajeAMostrar(new Date())
            conversacion.save(flush: true)
        }
        map["conversacion"] = conversacion
        conversacion = Conversacion.findByPrimeraPersonaAndSegundaPersona(segundaPersona, primeraPersona)
        if (!conversacion) {
            def conversacionSegundaPersona = new Conversacion()
            conversacionSegundaPersona.setPrimeraPersona(segundaPersona)
            conversacionSegundaPersona.setSegundaPersona(primeraPersona)
            conversacionSegundaPersona.setFechaPrimerMensajeAMostrar(new Date(0L))
            conversacionSegundaPersona.setMensajesSinLeer(false)
            conversacionSegundaPersona.setBorrada(false)
            segundaPersona?.addToConversaciones(conversacionSegundaPersona)
            map["saved"] = segundaPersona?.save() && map["saved"]
        }

        return map
    }

    /**
     * Agrega el mensaje tanto a la conversacion pasada como a su opuesta,
     * es decir, a la que tiene como primera persona a la segunda persona de la conversacion recibida y
     * como segunda persona a la primera de la conversacion recibida.
     * Esto si la conversacion con conversacionId no esta borrada
     * No se encarga de guardar el mensaje
     */
    def agregarMensaje(def conversacionId, Mensaje mensaje) {
        def conversacion = Conversacion.findById(conversacionId)
        if (!conversacion.borrada) {
            def conversacionOpuesta = Conversacion.findByPrimeraPersonaAndSegundaPersona(conversacion.getSegundaPersona(), conversacion.getPrimeraPersona())
            conversacion?.addToMensajes(mensaje)
            conversacion?.save(flush: true)
            conversacionOpuesta?.addToMensajes(mensaje)
            conversacionOpuesta?.setMensajesSinLeer(true)
            if (conversacionOpuesta.borrada) {
                conversacionOpuesta.setBorrada(false)
                def date = new Date()
                conversacionOpuesta.setFechaPrimerMensajeAMostrar(date)
                mensaje.setFechaEmision(date)
                mensaje.save(failOnError: true, flush: true)
            }
            conversacionOpuesta?.save(flush: true)
        }
    }

    /*
    * Devuelve los mensajes mayores o iguales a la fecha que posee la conversacion si esta no esta borrada
    *
    * */

    def getMensajesDeConversacion(def conversacionId) {
        def conversacion = Conversacion.findById(conversacionId)
        def list = new ArrayList<Mensaje>()

        if (!conversacion?.borrada) {
            for (def mensaje : conversacion?.getMensajes()?.sort {
                a, b ->
                return a.fechaEmision >= b.fechaEmision ? 1 : 0
            }) {
                if (mensaje.fechaEmision >= conversacion.getFechaPrimerMensajeAMostrar())
                    list.add(mensaje)
            }
        }
        return list
    }

    /*
   * Setea la variable borrada de la conversacion en true
   * */

    def borrar(def conversacionId) {
        def conversacion = Conversacion.findById(conversacionId)
        conversacion?.setBorrada(true)
        conversacion?.setFechaPrimerMensajeAMostrar(new Date())
        conversacion?.save(flush: true)
    }

    /*
    * Cambia la fecha de la conversacion para que sea mayor a la de todos lo mensajes
    *
    * */

    def borrarMensajes(def conversacionId) {
        def conversacion = Conversacion.findById(conversacionId)
        conversacion.setFechaPrimerMensajeAMostrar(new Date())
        conversacion.save(flush: true)
    }

}
